home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 684 / 684.xpi / chrome / fireftp.jar / content / js / etc / programs.js < prev    next >
Text File  |  2009-11-11  |  9KB  |  234 lines

  1. function loadPrograms() {
  2.   try {
  3.     var file = gProfileDir.clone();
  4.     file.append("fireFTPprograms.dat");
  5.  
  6.     if (file.exists()) {
  7.       var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
  8.       var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
  9.       fstream.init(file, 1, 0, false);
  10.       sstream.init(fstream);
  11.  
  12.       var programData = "";
  13.       var str = sstream.read(-1);
  14.  
  15.       while (str.length > 0) {
  16.         programData += str;
  17.         str          = sstream.read(-1);
  18.       }
  19.  
  20.       gPrograms = eval(programData);
  21.       cleanupPrograms();
  22.  
  23.       sstream.close();
  24.       fstream.close();
  25.     } else {
  26.       gPrograms = new Array({ extension: "*.*", programs: new Array() });
  27.       savePrograms();
  28.     }
  29.   } catch (ex) {
  30.     debug(ex);
  31.   }
  32. }
  33.  
  34. function savePrograms() {
  35.   try {
  36.     cleanupPrograms();
  37.     var file = gProfileDir.clone();
  38.     file.append("fireFTPprograms.dat");
  39.     var foutstream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  40.     foutstream.init(file, 0x04 | 0x08 | 0x20, 0644, 0);
  41.     foutstream.write(gPrograms.toSource(), gPrograms.toSource().length);
  42.     foutstream.close();
  43.   } catch (ex) {
  44.     debug(ex);
  45.   }
  46. }
  47.  
  48. function cleanupPrograms() {  // fix for bug with nulls in the program list
  49.   for (var x = gPrograms.length - 1; x >= 0; --x) {
  50.     if (!gPrograms[x]) {
  51.       gPrograms.splice(x, 1);
  52.       continue;
  53.     }
  54.     for (var y = gPrograms[x].programs.length - 1; y >= 0; --y) {
  55.       if (!gPrograms[x].programs[y]) {
  56.         gPrograms[x].programs.splice(y, 1);
  57.       }
  58.     }
  59.   }
  60. }
  61.  
  62. function chooseProgram(remote) {
  63.   var result       = { value: false };
  64.   var extension    = remote ? remoteTree.getExtension(remoteTree.data[remoteTree.selection.currentIndex].leafName) : localTree.getExtension(localTree.data[localTree.selection.currentIndex].leafName);
  65.   var tempPrograms = { value: new Array(), extension: extension };
  66.  
  67.   for (var x = 0; x < gPrograms.length; ++x) {
  68.     tempPrograms.value.push(gPrograms[x]);
  69.   }
  70.  
  71.   window.openDialog("chrome://fireftp/content/programs.xul", "programs", "chrome,modal,dialog,resizable,centerscreen", tempPrograms, result);
  72.  
  73.   if (result.value) {
  74.     gPrograms = tempPrograms.value;
  75.     savePrograms();
  76.   }
  77. }
  78.  
  79. function launchProgram(extensionIndex, programIndex, file, remoteFile) {
  80.   try {
  81.     if (file) {                                                                                   // do remote edit
  82.       var path     = gRemotePath.value;
  83.       var origFile = { lastModifiedTime: file.lastModifiedTime };
  84.       var tmpDir   = Components.classes["@mozilla.org/file/directory_service;1"].createInstance(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsILocalFile);
  85.       var intervalId;
  86.       var uploadId;
  87.       var uploadCallback;
  88.  
  89.       var func = function () {
  90.         if (!file.exists()) {
  91.           clearInterval(intervalId);
  92.  
  93.           return;
  94.         }
  95.  
  96.         if (file.lastModifiedTime != origFile.lastModifiedTime) {
  97.           origFile.lastModifiedTime = file.lastModifiedTime;
  98.           gFtp.remoteRefreshLater   = path;
  99.  
  100.           if (uploadId) {                                                                         // if we have an upload currently in progress/in queue cancel it
  101.             queueTree.cancel([{ id: uploadId }]);
  102.             if (uploadCallback) {
  103.               uploadCallback();
  104.             }
  105.             uploadId       = null;
  106.             uploadCallback = null;
  107.           }
  108.  
  109.           var count   = 1;                                                                        // XXX createUnique doesn't seem to work for some reason, have to do what it does manually
  110.           var tmpFile = Components.classes["@mozilla.org/file/directory_service;1"].createInstance(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsILocalFile);
  111.           tmpFile.append('temp-' + count + '-' + file.leafName);
  112.           while (tmpFile.exists()) {
  113.             ++count;
  114.             tmpFile.leafName = 'temp-' + count + '-' + file.leafName;
  115.           }
  116.  
  117.           var innerEx  = gFireFTPUtils.cutCopy(false, file, tmpFile, tmpDir, tmpFile.leafName);   // we copy the file over to avoid issues with locking
  118.  
  119.           if (innerEx) {
  120.             clearInterval(intervalId);
  121.  
  122.             throw innerEx;
  123.           }
  124.  
  125.           uploadCallback = function() {                                                           // get rid of tmp file when we're done
  126.             try {
  127.               uploadCallback = null;
  128.               tmpFile.remove(true);
  129.             } catch (ex) { }
  130.           };
  131.  
  132.           uploadId = gFtp.upload(tmpFile.path, remoteFile.path, false, file.fileSize, 0, uploadCallback, true);
  133.         }
  134.       };
  135.  
  136.       intervalId = setInterval(func, 1000);
  137.       gTempEditFiles.push({ file: file, id: intervalId });
  138.     }
  139.  
  140.     for (var x = 0; file || x < localTree.rowCount; ++x) {
  141.       if (file || localTree.selection.isSelected(x)) {
  142.         if (!file && !localFile.verifyExists(localTree.data[x])) {
  143.           continue;
  144.         }
  145.  
  146.         if (extensionIndex == null) {
  147.           if (remoteFile && gPlatform == 'mac') {                // since when is mac so vista-like?
  148.             var ipcService    = Components.classes["@mozilla.org/process/ipc-service;1"].getService(Components.interfaces.nsIIPCService);
  149.             ipcService.exec("/usr/bin/xattr -d com.apple.quarantine " + file.path);
  150.           }
  151.  
  152.           localFile.launch(file);
  153.         } else {
  154.           var program = localFile.init(gPrograms[extensionIndex].programs[programIndex].executable);
  155.           var arguments = new Array();
  156.  
  157.           if (!gPrograms[extensionIndex].programs[programIndex].arguments) {
  158.             arguments.push(file ? file.path : localTree.data[x].path);
  159.           } else {
  160.             var argumentString = gPrograms[extensionIndex].programs[programIndex].arguments;
  161.  
  162.             var quote = false;
  163.             for (var y = 0; y < argumentString.length; ++y) {
  164.               if (argumentString.charAt(y) == '"' || argumentString.charAt(y) == "'") {
  165.                 quote = !quote;
  166.               } else if (argumentString.charAt(y) == ' ' && !quote) {
  167.                 argumentString = setCharAt(argumentString, y, "%%%space%%%");
  168.               }
  169.             }
  170.  
  171.             while (argumentString.indexOf("%file%") != -1) {
  172.               argumentString = argumentString.substring(0, argumentString.indexOf("%file%"))
  173.                              + (file ? file.path : localTree.data[x].path)
  174.                              + argumentString.substring(argumentString.indexOf("%file%") + 6, argumentString.length);
  175.             }
  176.  
  177.             argumentString = argumentString.replace(/\\"/g, "%%%quotes%%%");
  178.             argumentString = argumentString.replace(/"/g, "");
  179.             argumentString = argumentString.replace(/%%%quotes%%%/g, '"');
  180.             arguments      = argumentString.split("%%%space%%%").filter(removeBlanks);
  181.           }
  182.  
  183.           var process = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
  184.           process.init(program);
  185.           process.run(false, arguments, arguments.length, {});
  186.         }
  187.  
  188.         if (file) {
  189.           break;
  190.         }
  191.       }
  192.     }
  193.  
  194.   } catch (ex) {
  195.     debug(ex);
  196.   }
  197. }
  198.  
  199. function remoteLaunchProgram(extensionIndex, programIndex, fileIndex) {
  200.   if (!gFtp.isConnected || !isReady()) {
  201.     return;
  202.   }
  203.  
  204.   try {
  205.     var count = 0;
  206.  
  207.     for (var x = 0; x < remoteTree.rowCount; ++x) {
  208.       if (remoteTree.selection.isSelected(x)) {
  209.         ++count;
  210.  
  211.         let tmpFile = Components.classes["@mozilla.org/file/directory_service;1"].createInstance(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsILocalFile);
  212.         tmpFile.append(count + '-' + remoteTree.data[x].leafName);
  213.         while (tmpFile.exists()) {
  214.           ++count;
  215.           tmpFile.leafName = count + '-' + remoteTree.data[x].leafName;
  216.         }
  217.  
  218.         count = 0;
  219.  
  220.         let remoteFile = remoteTree.data[x];
  221.  
  222.         var func = function() {
  223.           var subFunc = function() { launchProgram(extensionIndex, programIndex, tmpFile, remoteFile); };
  224.           setTimeout(subFunc, 0);                                                                     // let the queue finish up
  225.         };
  226.  
  227.         gFtp.download(remoteFile.path, tmpFile.path, remoteFile.fileSize, false, 0, false, func);
  228.       }
  229.     }
  230.   } catch (ex) {
  231.     debug(ex);
  232.   }
  233. }
  234.